home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / dossuppo.dpp < prev    next >
Encoding:
Modula Definition  |  1993-12-10  |  15.3 KB  |  343 lines

  1. DEFINITION MODULE DosSupport;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* Falls die Environmentvariable "STDERR" nicht existiert, und der Standard- *)
  14. (* kanal zwei (stdaux) nicht auf eine Datei umgelenkt ist (wird mit          *)
  15. (* "IsDevice()" festgestellt), wird Kanal zwei auf Handle -1 umgelenkt (CON) *)
  16. (* sodass Kanal zwei wie unter "*IX" als Standardfehlerkanal benutzt werden  *)
  17. (* kann.                                                                     *)
  18. (* --------------------------------------------------------------------------*)
  19. (* 05-Dez-93, Holger Kleinschmidt                                            *)
  20. (*****************************************************************************)
  21.  
  22. FROM PORTAB IMPORT
  23. (* TYPE *) UNSIGNEDLONG, SIGNEDWORD, WORDSET;
  24.  
  25. FROM types IMPORT
  26. (* TYPE *) PathName, StrPtr, StrRange;
  27.  
  28. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  29.  
  30. CONST
  31.   (* Anzahl der Zeichen, um die die Pfade nach Umwandlung durch
  32.    * "UnixToDos()" oder "DosToUnix()" maximal laenger bzw. kuerzer werden.
  33.    * Die Werte sind etwas groesser als notwendig.
  34.    *)
  35.   DINCR = 10;
  36.   XDECR = 10;
  37.  
  38.  
  39. CONST
  40. #ifdef __GEMDOS__
  41.   EXECSUFFIX = "TOS,TTP,PRG,APP,GTP";
  42.   TOSEXT     = "TOS,TTP";
  43.   GEMEXT     = "PRG,APP,GTP";
  44. #elif (defined __PCDOS__) (* ?? *)
  45.   EXECSUFFIX = "EXE,COM,APP";
  46.   DOSEXT     = "EXE,COM";
  47.   GEMEXT     = "APP";
  48. #endif
  49.  
  50. TYPE
  51. #if reverse_set
  52.   FileAttributes = (
  53.     fa15, fa14, fa13, fa12, fa11,
  54.     fa10, fa9,  fa8,  fa7,  fa6,  (* --> keine 8-Bit-Menge *)
  55.     faCHANGED,
  56.     faSUBDIR,
  57.     faVOLUME,
  58.     faSYSTEM,
  59.     faHIDDEN,
  60.     faRDONLY
  61.   );
  62. #else
  63.   FileAttributes = (
  64.     faRDONLY,
  65.     faHIDDEN,
  66.     faSYSTEM,
  67.     faVOLUME,
  68.     faSUBDIR,
  69.     faCHANGED,
  70.     fa6,  fa7,  fa8,  fa9,  fa10,
  71.     fa11, fa12, fa13, fa14, fa15  (* --> keine 8-Bit-Menge *)
  72.   );
  73. #endif /* reverse_set */
  74.  
  75.   FileAttribute = PACKEDSET OF FileAttributes;
  76.  
  77. CONST
  78.   FINDALL = FileAttribute{faRDONLY, faHIDDEN, faSYSTEM, faSUBDIR, faCHANGED};
  79.  
  80. TYPE
  81.   DTAPtr = POINTER TO DTA;
  82.  
  83.   DTA = RECORD
  84.     fill : ARRAY [0..19] OF CHAR;
  85.     attr : FileAttribute;
  86.     time : WORDSET;
  87.     date : WORDSET;
  88.     size : UNSIGNEDLONG;
  89.     name : ARRAY [0..13] OF CHAR;
  90.   END;
  91.  
  92. CONST
  93. #if (defined __GEMDOS__)
  94.   MinHandle = -5; (* wegen MiNT-MIDI-InOut *)
  95.   MaxHandle = 80;
  96. #elif (defined __PCDOS__)
  97.   MinHandle = 0;
  98.   MaxHandle = 31; (* je nach FILES in CONFIG.SYS ?? *)
  99. #endif
  100.  
  101. TYPE
  102.   HandleRange = [MinHandle..MaxHandle];
  103.  
  104. TYPE
  105.   FileType = (unknown, istty, notty);
  106.  
  107. TYPE
  108. #if reverse_set
  109.   DosFlags = (
  110.     Dos15, Dos14, Dos13,
  111.     noctty,
  112.     excl,
  113.     trunc,
  114.     creat,
  115.     nonblock,
  116.     crmod, cbreak, echo, raw,
  117.     append,
  118.     Dos2,
  119.     ac1,
  120.     ac0
  121.   );
  122. #else
  123.   DosFlags = (
  124.     ac0,
  125.     ac1,
  126.     Dos2,
  127.     append,
  128.     raw, echo, cbreak, crmod,
  129.     nonblock,
  130.     create,
  131.     trunc,
  132.     excl,
  133.     noctty,
  134.     Dos13, Dos14, Dos15
  135.   );
  136. #endif
  137.  
  138.   DosFlag = PACKEDSET OF DosFlags;
  139.  
  140. CONST
  141.   getmask = DosFlag{ac0,ac1,append,nonblock,create,trunc,excl,noctty};
  142.   setmask = DosFlag{ac0,ac1,raw,echo,cbreak,crmod};
  143.  
  144. TYPE
  145.   FdRec = RECORD
  146.     ftype : FileType;  (* Fuer schellere Bestimmung von "isatty()" *)
  147.     cloex : BOOLEAN;   (* vor 'Pexec' schliessen, nur fuer TOS *)
  148.     flags : DosFlag;   (* Attribute der offenen Datei, nur fuer TOS *)
  149.   END;
  150.  
  151.  
  152. (* Eigentlich muesste man getrennt nach Attributen fuer Dateikennungen und
  153.    Dateibeschreibungsbloecken (DBB) aufteilen, da zu einem DBB mehrere
  154.    Dateikennungen gehoeren koennen, und Aenderungen des DBB alle diese
  155.    Dateikennungen betreffen.
  156.    So entstehen beim Duplizieren von Dateikennungen unabhaengige DBB,
  157.    und das Aendern z.B. des oAPPEND-Flags einer Datei ueber die eine
  158.    Dateikennung hat keine Auswirkungen, wenn die Datei ueber die zweite
  159.    Kennung angesprochen wird. Dies sollte kein grosses Problem sein, und es
  160.    vereinfacht die Verwaltung, da sonst auch noch mitgezaehlt werden muesste,
  161.    wieviel Dateikennungen auf einen bestimmten DBB zugreifen, und bei jedem
  162.    'open' muesste auch ein freier DBB gesucht werden.
  163.  
  164.    Unter MiNT ist das kein Problem, da hier nur 'ftype' verwendet wird.
  165.  *)
  166.  
  167. VAR
  168.   FD : ARRAY HandleRange OF FdRec;
  169.  
  170. VAR
  171.   INODE   : UNSIGNEDLONG;
  172.   ROOTDIR : CHAR;    (* 'r<x>' in UNIXMODE gesetzt, ROOTDIR := x *)
  173.   BINIO   : BOOLEAN; (* 'b' in UNIXMODE gesetzt *)
  174.  
  175. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  176.  
  177.  PROCEDURE IsExec ((* EIN/ -- *) path : StrPtr ): BOOLEAN;
  178.  
  179.  PROCEDURE IsDosExec ((* EIN/ -- *) path : StrPtr ): BOOLEAN;
  180.  
  181.  PROCEDURE IsGEMExec ((* EIN/ -- *) path : StrPtr ): BOOLEAN;
  182.  
  183. (*--------------------------------------------------------------------------
  184.  | Diese Prozeduren stellen anhand der Extension des Dateinamens fest, ob   |
  185.  | die Datei ausfuehrbar ist. <path>^ muss im DOS-Format sein.              |
  186.  | Falls die Environment-Variablen "SUFFIX" bzw. "GEMEXT"/"TOSEXT" existie- |
  187.  | ren, wird geprueft, ob die Extension mit einer aus der durch Semikolon   |
  188.  | oder Komma getrennten Liste der Environment-Variablen uebereinstimmt.    |
  189.  | Existieren diese Variablen nicht, wird geprueft, ob eine der Extensionen |
  190.  | aus 'EXECSUFFIX' bzw. 'GEMEXT'/'TOSEXT' vorliegt. Die Gross-, Klein-     |
  191.  | schreibung wird nicht beachtet.                                          |
  192.   --------------------------------------------------------------------------*)
  193.  
  194.  
  195.  PROCEDURE IsDosDevice ((* EIN/ -- *) path : StrPtr ): BOOLEAN;
  196.  
  197. (*--------------------------------------------------------------------------
  198.  | IsDosDevice  <=>  <path> = "xx...:"  ,  x weder \ noch /.                |
  199.   --------------------------------------------------------------------------*)
  200.  
  201.  
  202.  PROCEDURE DosToUnix ((* EIN/AUS *)     dpath : StrPtr;
  203.                       (* EIN/ -- *)     xSize : StrRange;
  204.                       (* -- /AUS *)     xpath : StrPtr;
  205.                       (* -- /AUS *) VAR dlen  : INTEGER;
  206.                       (* -- /AUS *) VAR xlen  : INTEGER  );
  207.  
  208. (*--------------------------------------------------------------------------
  209.  | Die Prozedur dient dazu, die "DOS"-spezifischen Elemente eines Pfadnamens|
  210.  | in "*IX"-Aequivalente zu wandeln, falls dies moeglich ist. Im einzelnen  |
  211.  | werden folgende Umwandlungen vorgenommen:                                |
  212.  |                                                                          |
  213.  |     \                                 -->  /                             |
  214.  |     x:                                -->  /x         , ROOTDIR = 'u'    |
  215.  |                                       -->  /          , ROOTDIR = 'x'    |
  216.  |                                       -->  /dev/x     , sonst            |
  217.  |     x:\..., x:...                     -->  /x/...     , ROOTDIR = 'u'    |
  218.  |                                       -->  /...       , ROOTDIR = 'x'    |
  219.  |                                       -->  /dev/x/... , sonst            |
  220.  |     con:                              -->  /dev/tty                      |
  221.  |     xx...:..                          -->  /dev/xx...                    |
  222.  | falls MiNT aktiv, zusaetzlich                                            |
  223.  |     V:\...                            -->  /dev/...                      |
  224.  |     Q:\...                            -->  /pipe/...                     |
  225.  |     U:\dev\...                        -->  /dev/...                      |
  226.  |     U:\pipe\...                       -->  /pipe/...                     |
  227.  |     U:\x, U:\x\...                    -->  wie x:, x:\...                |
  228.  |                                                                          |
  229.  | <xpath>^ enthaelt soviel vom umgewandelten Pfad wie moeglich. <xlen> ent-|
  230.  | haelt die Laenge des UNGEKUERZTEN Pfades. Falls also <xlen> groesser als |
  231.  | der Platz in <xpath> ist, musste gekuerzt werden. <xSize> gibt den Platz |
  232.  | in <xpath> an. <xpath>^ ist nur dann mit einem Nullbyte abgeschlossen,   |
  233.  | wenn der Platz dafuer ausreicht (<xlen> < <xSize>).                      |
  234.  | <dlen> enthaelt die Laenge von <dpath>.                                  |
  235.  | <xpath> ist maximal 'XDECR' Zeichen kuerzer als <dpath>.                 |
  236.  | Da die Umsetzungen, die die Laenge des Pfades veraendern, nur von den    |
  237.  | ersten Zeichen von <dpath>^ abhaengen, braucht kein vollstaendiger DOS-  |
  238.  | Pfad angegeben werden, um zu ermitteln, wieviele Zeichen der *IX-Pfad    |
  239.  | laenger oder kuerzer werden wuerde (<xlen> - <dlen>).                    |
  240.  | Da <dpath>^ veraendert wird, muss der Pfad vorher kopiert werden, wenn er|
  241.  | noch gebraucht wird.                                                     |
  242.   --------------------------------------------------------------------------*)
  243.  
  244.  PROCEDURE UnixToDos ((* EIN/ -- *) VAR xpath : ARRAY OF CHAR;
  245.                       (* EIN/ -- *)     xlen  : CARDINAL;
  246.                       (* EIN/ -- *)     dSize : StrRange;
  247.                       (* -  /AUS *)     dpath : StrPtr;
  248.                       (* -- /AUS *) VAR dot   : BOOLEAN;
  249.                       (* -- /AUS *) VAR done  : BOOLEAN       );
  250.  
  251. (*--------------------------------------------------------------------------
  252.  | Die Prozedur dient dazu, die "*IX"-spezifischen Elemente eines Pfadnamens|
  253.  | in "DOS"-Aequivalente zu wandeln, falls dies moeglich ist. Im einzelnen  |
  254.  | werden folgende Umwandlungen vorgenommen:                                |
  255.  |                                                                          |
  256.  |     /                                 -->  \                             |
  257.  |                                                                          |
  258.  |     /., /..                           -->  /                             |
  259.  |     /./xx, /../xx                     -->  /xx                           |
  260.  | falls das aktuelle Verzeichnis das Wurzelverzeichnis ist, auch:          |
  261.  |     ., ..                             -->  /                             |
  262.  |     ./xx, ../xx                       -->  /xx,                          |
  263.  |                                                                          |
  264.  |     /dev/x                            -->  x:                            |
  265.  |     /dev/x/..., /dev/x\...            -->  x:\...                        |
  266.  |     /dev/tty                          -->  con:                          |
  267.  |     /dev/xx...                        -->  xx...:                        |
  268.  | falls MiNT aktiv                                                         |
  269.  |     /dev/xx...                        -->  U:\dev\...                    |
  270.  |     /pipe/...                         -->  U:\pipe\...                   |
  271.  |                                                                          |
  272.  | <dpath>^ wird immer mit einem Nullbyte abgeschlossen.                    |
  273.  | <xlen> ist die Laenge von <xpath>.                                       |
  274.  | <dSize> gibt den Platz in <dpath> an.                                    |
  275.  | <dot> == <dpath>^ = ("." | "xxx\." | "x:." | ".." | "xxx\.." | "x:..")   |
  276.  |                                                                          |
  277.  | Falls in der Environmentvariablen UNIXMODE der Teilstring "rX" enthalten |
  278.  | ist, wird eine Pfadangabe der Form "\..." zu "X:\..." umgewandelt,       |
  279.  | allerdings nicht, wenn der \ durch die Umwandlung von '.' oder '..'      |
  280.  | entstanden ist (siehe oben).                                             |
  281.  |                                                                          |
  282.  | Wenn <dpath>^ den vollstaendigen umgewandelten Pfad aufnehmen konnte     |
  283.  | (einschliesslich dem abschliessenden Nullbyte), ist <done> = TRUE, sonst |
  284.  | ist <done> = FALSE, und 'e.errno' wird auf 'ENAMETOOLONG' gesetzt;       |
  285.  | <dpath>^ und <dot> sind dann undefiniert.                                |
  286.  | <dSize> gibt den Platz in <dpath> an und muss mindestens 1 sein.         |
  287.  | Falls <xpath>^ der Leerstring ist, wird 'e.errno' auf 'ENOENT' gesetzt,  |
  288.  | und <done> ist ebenfalls FALSE.                                          |
  289.  | <dpath>^ ist maximal 'DINCR' Zeichen (incl. Nullbyte) laenger als        |
  290.  | <xpath>^.                                                                |
  291.   --------------------------------------------------------------------------*)
  292.  
  293.  
  294.  
  295.  PROCEDURE FindFirst ((* EIN/ -- *)     path : StrPtr;
  296.                       (* EIN/ -- *)     attr : FileAttribute;
  297.                       (* EIN/AUS *) VAR dta  : DTA;
  298.                       (* -- /AUS *) VAR res  : INTEGER       ): BOOLEAN;
  299.  
  300.  PROCEDURE FindNext ((* EIN/AUS *) VAR dta : DTA;
  301.                      (* -- /AUS *) VAR res : INTEGER ): BOOLEAN;
  302.  
  303. (*--------------------------------------------------------------------------
  304.  | Fuehren ein "GEMDOS-Fsfirst" bzw. "Fsnext" aus. Der Funktionswert ist    |
  305.  | TRUE, falls eine Datei gefunden wurde, falls nicht, enthaelt <err> den   |
  306.  | Fehlercode. <dta> bei "FindNext()" muss die gleiche wie bei "FindFirst()"|
  307.  | sein. Da die DTA jedesmal explizit gesetzt wird, kann sie zwischendurch  |
  308.  | auch beliebig umgesetzt werden.                                          |
  309.   --------------------------------------------------------------------------*)
  310.  
  311.  PROCEDURE CompletePath ((* EIN/ -- *)     path  : StrPtr;
  312.                          (* EIN/ -- *)     fSize : StrRange;
  313.                          (* -- /AUS *)     full  : StrPtr;
  314.                          (* -- /AUS *) VAR fLen  : INTEGER;
  315.                          (* -- /AUS *) VAR err   : INTEGER  ): BOOLEAN;
  316.  
  317. (*--------------------------------------------------------------------------
  318.  | Falls die Laufwerksangabe in <path>^ fehlt, und/oder nur ein relativer   |
  319.  | Pfad angegeben ist, werden Laufwerk und/oder aktueller Pfad ergaenzt.    |
  320.  | <full>^ enthaelt die vervollstaendigte Pfadangabe. <fSize> gibt den Platz|
  321.  | in <full> fuer den Pfad einschliesslich Nullbyte an. <fLen> ist die      |
  322.  | Laenge des Pfades in <full>^; da <full>^ mindestens die Laufwerksangabe  |
  323.  | und das Wurzelverzeichnis enthaelt, ist <fLen> mindestens gleich drei.   |
  324.  | <full>^ ist immer mit einem Nullbyte abgeschlossen.                      |
  325.  | <fSize> muss mindestens 4 sein, sonst wird ein Fehler gemeldet.          |
  326.  | Wenn ein Fehler aufgetreten ist, wird FALSE als Funktionswert geliefert  |
  327.  | und <err> enthaelt den Fehlercode; <fLen> und <full>^ sind dann nicht    |
  328.  | definiert.                                                               |
  329.  | !ACHTUNG: <fSize> wird nur unter MiNT beachtet (-> 'Dgetcwd'), unter TOS |
  330.  | (oder einem alten MiNT < 0.96) muss <full> ausreichend gross sein        |
  331.  | (mindestens 128 Zeichen)!                                                |
  332.   --------------------------------------------------------------------------*)
  333.  
  334.  
  335.  PROCEDURE IsTerm ((* EIN/ -- *) h : INTEGER ): BOOLEAN;
  336.  
  337. (*--------------------------------------------------------------------------
  338.  | Es wird genau dann "TRUE" geliefert, wenn auf das (gueltige) Handle kein |
  339.  | "Seek" angewendet werden kann, dabei aber kein Fehler gemeldet wird.     |
  340.   --------------------------------------------------------------------------*)
  341.  
  342. END DosSupport.
  343.